<?php
/**
 * 文件: db_sqlite.class.php
 * 作用：sqlite 数据库类
 * 作者：lifushui
 * 日期：2009/09/11 11:20:30
 * 使用方法： include 'db_sqlite.class.php';//包含sqlite类文件
$db = new db_sqlite;//实例db_sqlite类
$db -> connect('test.db');//打开数据库
 */
class db_sqlite
{
    var $conn;
    var $querynum = 0;

    /**
     * 数据库连接，返回数据库连接标识符
     *
     * @param string $ 数据库服务器主机
     * @param string $ 数据库服务器帐号
     * @param string $ 数据库服务器密码
     * @param string $ 数据库名
     * @param bool $ 是否保持持续连接，1为持续连接，0为非持续连接
     * @return link_identifier $dbuser, $dbpw, $dbname,
     */
    function connect($dbhost, $pconnect = 0)
    {
        $error = '';
        $func = $pconnect == 1 ? 'sqlite_popen' : 'sqlite_open';
        if (!$this->conn = $func($dbhost, 0666, $error)) {
            $this->halt($error);
        }
        return $this->conn;
    }

    /**
     * 执行sql语句
     *
     * @param string $ sql语句
     * @param string $ 默认为空，可选值为 CACHE UNBUFFERED
     * @param int $ Cache以秒为单位的生命周期
     * @return resource
     */
    function query($sql, $type = '', $expires = 3600, $dbname = '')
    {
        $error = '';
        $func = $type == 'UNBUFFERED' ? 'sqlite_unbuffered_query' : 'sqlite_query';
        if (preg_match("/^\s*SELECT/i", $sql)) {
            $query = $func($this->conn, $sql, SQLITE_ASSOC, $error);
        } else {
            $query = sqlite_exec($this->conn, $sql, $error);
        }
        if ($error) {
            $this->halt($error, $sql);
        }
        $this->querynum++;
        return $query;
    }

    /**
     * 执行sql语句，只得到一条记录
     * @param string $ sql语句
     * @param string $ 默认为空，可选值为 CACHE UNBUFFERED
     * @param int $ Cache以秒为单位的生命周期
     * @return array
     */
    function get_one($sql, $type = '', $expires = 3600, $dbname = '')
    {
        $query = $this->query($sql, $type, $expires, $dbname);
        $rs = $this->fetch_array($query);
        $this->free_result($query);
        return $rs;
    }

    /**
     * 从结果集中取得一行作为关联数组
     *
     * @param resource $ 数据库查询结果资源
     * @param string $ 定义返回类型
     * @return array
     */
    function fetch_array($query, $result_type = SQLITE_ASSOC)
    {
        return sqlite_fetch_array($query, $result_type);
    }

    /**
     * 取得前一次 Sqlite操作所影响的记录行数
     *
     * @return int
     */
    function affected_rows()
    {
        return sqlite_changes($this->conn);
    }

    /**
     * 取得结果集中行的数目
     *
     * @return int
     */
    function num_rows($query)
    {
        return sqlite_num_rows($query);
    }

    /**
     * 返回结果集中字段的数目
     *
     * @return int
     */
    function num_fields($query)
    {
        return sqlite_num_fields($query);
    }

    /**
     *
     * @return array 备用,一般不用.
     */
    function result($query, $row)
    {
        return @sqlite_fetch_all($query, SQLITE_ASSOC);
    }

    /**
     * sqlite没有相应函数
     */
    function free_result($query)
    {
        return;
    }

    /**
     * 取得上一步 INSERT 操作产生的 ID
     *
     * @return int
     */
    function insert_id()
    {
        return sqlite_last_insert_rowid($this->connid);
    }

    /**
     *
     * @return array 只得到数字索引
     */
    function fetch_row($query)
    {
        return sqlite_fetch_array($query, SQLITE_NUM);
    }

    /**
     */
    function fetch_assoc($query)
    {
        return $this->fetch_array($query, SQLITE_ASSOC);
    }

    /**
     *
     * @return string
     */
    function version()
    {
        return sqlite_libversion();
    }

    function close()
    {
        return sqlite_close($this->conn);
    }

    /**
     *
     * @return string
     */
    function error()
    {
        return sqlite_error_string($this->errno);
    }

    /**
     *
     * @return int
     */
    function errno()
    {
        return sqlite_last_error($this->conn);
    }

    /**
     * 显示mysql错误信息
     */
    function halt($message = '', $sql = '')
    {
        exit("SqliteQuery:$sql <br> SqliteError:" . $this->error() . " <br> SqliteErrno:" . $this->errno() . " <br> Message:$message");
    }
}

?>
